﻿Imports System.Data.SqlClient

Public Class FrmSocio

    Private Sub SocioBindingNavigatorSaveItem_Click(sender As System.Object, e As System.EventArgs) Handles SocioBindingNavigatorSaveItem.Click
        If Me.Validate() Then
            Try
                'Termina la edición del registro actual. Esto es necesario debido
                'a que los cambios del registro actual se actualizan llamando a este
                'método o cuando se pasa a un nuevo registro. Se actualiza el registro
                'en el DataSet en memoria, no en la base de datos
                Me.SocioBindingSource.EndEdit()
                'Cuando se llama a UpdateAll sí se quiere actualizar la base de datos
                Me.TableAdapterManager.UpdateAll(Me.VideoDataSet)
            Catch ex As DBConcurrencyException
                'Ocurre cuando hay un error de concurrencia. Esto puede ocurrir cuando
                'por ejemplo queremos actualizar un registro que ya fue borrado de la
                'base de datos física
                MessageBox.Show("Un error de concurrencia ha ocurrido")
                Me.SocioTableAdapter.Fill(VideoDataSet.Socio)
            Catch ex As DataException
                'Puede ser una excepción del tipo NotNullAllowedException o ConstraintException.
                'Ambas excepciones heredan de DataException por lo que se puede capturar las dos
                'con un solo bloque Catch o si se quiere se pueden capturar por separado.
                'NotNullAllowedException: ocurre cuando se quiere almacenar un nulo en una columna
                'de la base de datos que se ha marcado como requerida
                'ConstraintException: ocurre cuando la operación viola una restricción. Por ejemplo,
                'un registro de clave foránea apunta a una clave primaria que no existe.
                MessageBox.Show(ex.Message)
                SocioBindingSource.CancelEdit()
            Catch ex As SqlException
                'Atrapa un error del proveedor de conexión
                'Puede ser que el servidor de base de datos esté caído
                'o la conexión de la red esté caída, por ejemplo.
                'Atrapamos SqlException porque estamos usando el proveedor de
                'datos de SqlServer. Si utilizáramos Odbc, entonces atraparíamos
                'OdbcException (con otros proveedores haríamos lo mismo).
                'Esta excepción puede ocurrir cuando llamamos al
                'método UpdateAll del objeto TableAdapterManager dado que es
                'quien se encarga de interactuar con la base de datos
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub

    Private Sub FrmSocio_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ManejarEventosParaFormatearElCampoDeTelefono()
        Try
            'Carga los datos de la base de datos al DataSet
            Me.SocioTableAdapter.Fill(Me.VideoDataSet.Socio)
        Catch ex As SqlException
            'Volvemos a capturar esta excepción debido a que estaremos interactuando
            'con la base de datos real
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

#Region "Para dar un formato personalizado a un campo"
    Private Sub ManejarEventosParaFormatearElCampoDeTelefono()
        'Si quiero hacer un formateo personalizado de un campo
        'Obtengo el objeto binding que se encarga de actualizar la propiedad texto del textbox del telefono
        Dim telefonoBinding As Binding = TelefonoTextBox.DataBindings("Text")
        'Manejo el evento Format de ese objeto binding. Este evento ocurre justo antes de mostrar el dato
        'en el control especificado
        AddHandler telefonoBinding.Format, AddressOf FormatTelefono
        AddHandler telefonoBinding.Parse, AddressOf UnformatTelefono
    End Sub

    Private Sub FormatTelefono(sender As Object, e As ConvertEventArgs)
        If (e.Value.GetType() = Type.GetType("System.String")) Then
            Dim numeroDeTelefonoCompleto, numeroDeArea, prefijo, restoDelNumero As String
            numeroDeTelefonoCompleto = e.Value.ToString()
            If numeroDeTelefonoCompleto.Length > 6 Then
                numeroDeArea = numeroDeTelefonoCompleto.Substring(0, 4)
                prefijo = numeroDeTelefonoCompleto.Substring(4, 3)
                restoDelNumero = numeroDeTelefonoCompleto.Substring(7)
                'Cambio el valor que se va a mostrar
                e.Value = "(" & numeroDeArea & ") " & prefijo & "-" & restoDelNumero
            End If
        End If
    End Sub

    Private Sub UnformatTelefono(sender As Object, e As ConvertEventArgs)
        Dim numeroDeTelefono As String = e.Value.ToString()
        numeroDeTelefono = numeroDeTelefono.Replace("(", "")
        numeroDeTelefono = numeroDeTelefono.Replace(")", "")
        numeroDeTelefono = numeroDeTelefono.Replace("-", "")
        numeroDeTelefono = numeroDeTelefono.Replace(" ", "")
        e.Value = numeroDeTelefono
    End Sub
#End Region

    Private Sub StringNotEmpty_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles DniTextBox.Validating, NombreTextBox.Validating, ApellidoTextBox.Validating, DomicilioTextBox.Validating
        Dim control As Control = CType(sender, TextBox)
        If String.IsNullOrEmpty(control.Text) Then
            ErrorProvider.SetError(control, "No puede ser nulo")
            e.Cancel = True
        Else
            ErrorProvider.SetError(control, Nothing)
        End If
    End Sub
End Class
